package com.tedu.day02.oop;
/**
 * 抽象类特点<补充>
 *          类：成员变量/成员方法/构造方法
 *       抽象类：成员变量/成员方法/构造方法
 *       创建抽象类---普通类变成（实现）子类---继承抽象类
 *       成员变量：既可以是变量，也可以是常量
 *       构造方法：有，用于子类调用抽象【父】类的成员变量----赋值
 *       成员方法：既可以抽象，非抽象
 *       抽象方法与非抽象方法出现在抽象类问题：
 *       A：抽象方法【重写】强制要求子类完成父类的抽象方法
 *       B：非抽象方法【拓展】子类继承事情，提高代码复用性
 */
abstract class Foo{
    //成员变量
    public int i=10;
    public final int J=20;//成员变量：变成常量
    //Java强类型语言：大小写分明    public int j=30;
    //构造方法
    public Foo() {//无参
        this(30);//调用当前类的其他构造器
    }
    public Foo(int i) {
        this.i = 30;//左侧位不参与运算
    }
    //成员方法
    public abstract void show();//抽象方法
    public void method(){
        System.out.println("Foo------method");
    }
}
//实现 {子类}
class Goo extends Foo{
    public void show() {
        System.out.println("Goo show");
    }
    public void method(){
        System.out.println("Goo method");
    }
}
public class 抽象类补充知识点 {
    public static void main(String[] args) {
        //抽象类---继承---多态---向上造型
        Foo f=new Goo();
        //①实例化---子类的构造器，默认存在无参构造器，再通过super（）调用父类无参构造器
        //②执行抽象类当中无参构造器，发现有this（参数）调用本类其他有参的构造器
        //③this调用同时，完成对抽象类中 i 进行赋值i=30
        System.out.println(f.i);//④输出i值  30
        //f.J=40;  不可修改
        System.out.println(f.J);
        //---------------
        f.show();     //输出Goo show   被重写
        f.method();   //输出Goo method   拓展【子类方法重写】
    }
}
/*拓展：abstract关键共存问题*/
abstract class Aoo{
    //private abstract void show1();  冲突
    //public final abstract void show2(); 冲突
    //public static abstract void show3();无意义：静态方法，需要加{语法块}/抽象方法
}

